package com.appspot.modutajataja;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

public class CrashGame extends Activity {
	MediaPlayer mediaPlayer; 																					// 배경음악 실행 변수
	MediaPlayer gameSoundReadygo;																	// 게임효과음 실행 변수
	MediaPlayer gameSoundTok; 																			// 게임효과음 실행 변수
	MediaPlayer gameSoundPang; 																			// 게임효과음 실행 변수	
	
	LinearLayout card_layout;																					// 카드 레이아웃
	ImageView[] card = new ImageView[5]; 															// card 배열 변수
	private final int touchCount = 200;																	// card touch횟수 설정
	int[] countArr = { 0, 0, 0, 0, 0 };																			// card touch횟수 저장을 위한 배열
	int[] imageArr = { R.drawable.icon1, R.drawable.icon1, 
			R.drawable.icon1, R.drawable.icon1, R.drawable.icon1}; 						// 카드 앞면 이미지 저장을 위한 배열
	int cardNo; 																											// 선택된 card번호 저장
	
	private ProgressBar progressBar = null; 															// 프로그레스바 변수
	private static final int MSG_PROGRESS = 1; 												// 프로그레스 핸들러를 위한 변수 설정
	private Message msg; 																						// 프로그레스바 변경을 위한 메시지 변수
	ProgressHandler progressHandler = new ProgressHandler(); 						// 프로그레스 핸들러 변수
	Timer timerProgress = new Timer(); 																	// 프로그레스 세팅을 위한 타이머
	
	private Animation aniAd; 																						// 명령 텍스트 애니메이션 변수
	
	Timer timerGame = new Timer(); 																		// 게임 준비/시작을 위한 타이머
	TextView timer;			 																							// 시간을 표시하는 textView	
	long myBaseTime; 																								// 타이머를 계산하기 위한 시스템 시간
	long outTime;																											// 계산된 시간을 출력하기 위한 변수
	boolean gameOver; 																								// 게임 종료 후 score인텐트를 한번만 부르기 위한 플래그
	
	ImageView gameReady;																						// 게임 준비 이미지 뷰
	ImageView gameStart;																							// 게임 시작 이미지 뷰
	int imageIndex;																										// 게임 준비/시작 이미지 변경을 위한 인덱스
	
	private String userId;																							// 사용자 유저 ID
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.crash_game);
		
		userId = getIntent().getStringExtra("userId");

		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

		aniAd = new AlphaAnimation(0.1f, 1.0f);
		aniAd.setRepeatMode(Animation.REVERSE);
		aniAd.setRepeatCount(Animation.INFINITE);
		aniAd.setDuration(1500);
		aniAd.setFillAfter(true);

		TextView textCommand = (TextView) findViewById(R.id.text_command);
		textCommand.setAnimation(aniAd);
		textCommand.startAnimation(aniAd);

		for (int i=0; i<5; i++) {
			card[i] = (ImageView) findViewById(R.id.card_crash1+i);
			card[i].setOnClickListener(new CardHandler());
			card[i].setEnabled(false);			
		}
		
		imageArr[new Random().nextInt(5)] = R.drawable.event;

		card_layout = (LinearLayout)findViewById(R.id.crash_card_layout);
		gameReady = (ImageView)findViewById(R.id.game_ready);
		gameStart = (ImageView)findViewById(R.id.game_go);

		progressBar = (ProgressBar) findViewById(R.id.progressBar);
		progressBar.setMax(touchCount);

		timer = (TextView) findViewById(R.id.timer);
		timer.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/cartoonist.ttf"));
		
		gamestart();		
	} // end of onCreate()

	// 게임 준비 및 스타트 선언
	public void gamestart() {
		final Handler handler = new Handler();
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				handler.post(new Runnable() {
					@Override
					public void run() {
						if(imageIndex==0) {
							gameReady.setVisibility(View.VISIBLE);
							gameSoundReadygo.start();
							imageIndex=1;
						} else if(imageIndex==1) {
							gameReady.setVisibility(View.INVISIBLE);
							gameStart.setVisibility(View.VISIBLE);
							imageIndex=2;
						} else if(imageIndex==2) {
							gameStart.setVisibility(View.INVISIBLE);
							timerGame.cancel();
							for (int i=0; i<5; i++) {			
								card[i].setEnabled(true);	
							}
							mediaPlayer.start();
							timerStart();
							progressDecrease();
						}
					}
				});
			}
		};
		timerGame.schedule(task, 1000, 1000);
	} // end of gamestart()

	// 프로그레스바 핸들러 선언
	private class ProgressHandler extends Handler {
		public void handleMessage(Message msg) {
			int currentProgress = msg.arg1;
			switch (msg.what) {
			case MSG_PROGRESS:
				progressBar.setProgress(currentProgress);
				break;
			default:
				break;
			}
		}
	} // end of ProgressHandler

	// 프로그레스바 감소를 위한 메소드
	public void progressDecrease() {
		final Handler handler = new Handler();
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				handler.post(new Runnable() {
					@Override
					public void run() {
						if (countArr[cardNo] > 0) {
							progressBar.setProgress(--countArr[cardNo]);
						}
					}
				});
			}
		};
		timerProgress.schedule(task, 20, 20);
	} // end of progressDecrease()

	// 카드 터치를 인식하고 한 카드에 대해 touchCount 만큼 터치시 카드 뒤집기, 터치할 때 마다 프로그레스바 증가 시킴
	class CardHandler implements OnClickListener {
		@Override
		public void onClick(View v) {
			if (v.getId() == R.id.card_crash1) {
				cardNo = 0;
			} else if (v.getId() == R.id.card_crash2) {
				cardNo = 1;
			} else if (v.getId() == R.id.card_crash3) {
				cardNo = 2;
			} else if (v.getId() == R.id.card_crash4) {
				cardNo = 3;
			} else if (v.getId() == R.id.card_crash5) {
				cardNo = 4;
			}
			cardAction();
			progressHandler.sendMessage(msg);
		}
	} // end of CardHandler Class

	// card 터치시 action 설정 메소드
	public void cardAction() {
		msg = progressHandler.obtainMessage(MSG_PROGRESS, countArr[cardNo], 0);
		gameSoundTok.start();
		for (int i=0; i<5; i++) {
			if (i != cardNo) {
				countArr[i] = 1;
			}
		}
		if (countArr[cardNo] >= touchCount) {
			card[cardNo].setImageResource(imageArr[cardNo]);
			gameSoundPang.start();
			if ((imageArr[cardNo] == R.drawable.event) && (!gameOver)) {
				gameOver = true;
				timerEnd();
				timerProgress.cancel();
				new Handler().postDelayed(new Runnable() {
					public void run() {
						Bundle extras = new Bundle();
						extras.putLong("result_time", outTime);
						extras.putString("gameName", "crashGame");
						extras.putString("userId", userId);
						startActivity((new Intent(CrashGame.this, GameScore.class).putExtras(extras)));
						finish();
					}
				}, 1000); 
			}
		}
		countArr[cardNo] += 15;
	}

	// timer를 시작하기 위한 메소드
	public void timerStart() {
		myBaseTime = SystemClock.elapsedRealtime();
		myTimer.sendEmptyMessage(0); 				// myTimer이라는 핸들러를 빈 메세지를 보내서 호출
	}

	// timer를 종료하기 위한 메소드
	public void timerEnd() {
		myTimer.removeMessages(0); 					// myTimer이라는 핸들러를 remove 메세지를 보내서 타이머 종료
	}

	// timer 핸들러를 통해 시간 표시
	Handler myTimer = new Handler() {
		public void handleMessage(Message msg) {
			getTimeOut();
			myTimer.sendEmptyMessage(0);
		}
	};

	// 현재시간을 계속 구해서 출력하는 메소드
	public void getTimeOut() {		
		outTime = SystemClock.elapsedRealtime() - myBaseTime; 				// 타이머 호출 시간과 get 메소드 호출시간을 차이를 통해 출력시간 표시
		timer.setText(String.format("%02d : %02d : %02d", outTime/1000/60, (outTime/1000)%60, (outTime%1000)/10));		
	}

	@Override
	protected void onResume() {
		super.onResume();
		mediaPlayer = MediaPlayer.create(this, R.raw.crash_game);
		gameSoundReadygo = MediaPlayer.create(this, R.raw.readygo);
		gameSoundTok = MediaPlayer.create(this, R.raw.tok);
		gameSoundPang = MediaPlayer.create(this, R.raw.pang);
		mediaPlayer.setLooping(true);		
	}

	@Override
	protected void onPause() {
		super.onPause();
		mediaPlayer.stop();
		gameSoundReadygo.stop();
		gameSoundTok.stop();
		gameSoundPang.stop();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
	}

	@Override
	public void onBackPressed() { ; }
};